前言
这里是课程笔记。
这是一门好课,这门课非常细致。
事实上,不必深究MATLAB的语法细节。
略去了一些在数学建模中没有用处的章节和内容。
基本操作与矩阵输入
运算符
- 运算符:
+
、-
、*
、/
、^
(乘方)、=
(赋值) - 运算优先级
- 同等优先级下从左向右
- 优先级顺序(从高到低)
1.括号()
2.乘方^
3.乘除法*
、/
4.加减法+
、-
变量
变量名
- 变量不需要预先声明
- 变量名是大小写敏感的,且应当以字母开头
数据类型
特殊的变量与常量
ans
:存储运算结果i
,j
:虚数单位Inf
:无穷大(例:1/0
)eps
:2.2204e-016
NaN
:非数(例:Inf/Inf
)pi
:圆周率
优先级
(可通过iskeyword
给出系统中所有预先定义好的关键字)
1 | >> cos='This string.'; |
变量格式化输出format []
命令 | 效果 | 示例 |
---|---|---|
short |
显示小数点后4位(默认) | 3.1416 |
long |
显示小数点后15位(双精度),显示小数点后7位(单精度) | 3.141592653589793 |
shortE |
科学记数法显示小数点后4位 | 3.1416e+00 |
longE |
科学记数法显示小数点后15位(双精度),科学记数法显示小数点后7位(单精度) | 3.141592653589793e+00 |
bank |
货币格式显示小数点后2位 | 3.14 |
hex |
显示十六进制形式 | 400921fb54442d18 |
rat |
显示有理数形式 | 355/113 |
命令行
函数嵌入
函数可以嵌入到其他函数中,例如下面两段等价
1
sin(cos(pi))
1
2cos(pi)
sin(ans)多行代码可以合并
特殊命令
- 语句末尾加
;
将不显示运算结果 - 使用
↑
显示历史命令 clc
:清空命令窗口clear
:清除所有变量clear <xxx>
:清除变量<xxx>
who
:显示所有变量名whos
:显示所有变量信息
矩阵
创建矩阵
用
[]
把矩阵内容括起来,用`或
,隔开行内变量,用
;`分隔每一行1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22>> a = [1 2 3 4]
a =
1 2 3 4
>> b = [1;2;3;4]
b =
1
2
3
4
>> [1 21 6; 5 17 9; 31 2 7]
ans =
1 21 6
5 17 9
31 2 7[j:i:k]
:使用冒号运算符:
建立矩阵,其中i
的缺省值为1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33>> B = 1:5
B =
1 2 3 4 5
>> B = 1:2:5
B =
1 3 5
>> B = [1:5; 2:3:15; -2:0.5:0]
B =
列 1 至 3
1.000000000000000 2.000000000000000 3.000000000000000
2.000000000000000 5.000000000000000 8.000000000000000
-2.000000000000000 -1.500000000000000 -1.000000000000000
列 4 至 5
4.000000000000000 5.000000000000000
11.000000000000000 14.000000000000000
-0.500000000000000 0
>> str = 'a':2:'z'
str =
'acegikmoqsuwy'合并原有矩阵
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20>> A = [1 2; 3 4]
A =
1 2
3 4
>> B = [5 6; 7 8]
B =
5 6
7 8
>> C = [A B]
C =
1 2 5 6
3 4 7 8
矩阵索引
矩阵元素按列存储,起始下标为
1
可以使用行列下标索引矩阵元素
可以使用一维下标索引矩阵元素
:
表示所有行或所有列1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39>> A = [1 21 6; 5 17 9; 31 2 7]
A =
1 21 6
5 17 9
31 2 7
>> A(8)
ans =
9
>> A([1 3 5])
ans =
1 31 17
>> A([1 3; 1 3])
ans =
1 31
1 31
>> A(3, 2)
ans =
2
>> A([1 3], [1 3])
ans =
1 6
31 7
矩阵删除
使用空矩阵[]
替换原有矩阵元素即完成删除操作
矩阵运算
运算符 | 操作 | 形式 | 例子 |
---|---|---|---|
+ |
矩阵与实数相加 | A+b |
[6 3] + 2 = [8 5] |
- |
矩阵与实数相减 | A-b |
[6 3] - 2 = [4 1] |
+ |
矩阵与矩阵对应位置相加 | A+B |
[6 3] + [4 8] = [10 11] |
- |
矩阵与矩阵对应位置相减 | A-B |
[6 3] - [4 8] = [2 -5] |
* |
矩阵与矩阵相乘 | A*B |
[6 3] * [4 8]' = 48 |
.* |
矩阵与矩阵对应位置相乘 | A.*B |
[6 3] .* [4 8] = [24 24] |
/ |
矩阵与矩阵右除(等价于A*inv(B) ) |
A/B |
[6 3] / [4 8] = 0.6 |
\ |
矩阵与矩阵左除(等价于inv(A)*B ) |
A\B |
[6 3] \ [4 8] = [0.06667 1.3333; 0 0] |
./ |
矩阵与矩阵对应位置右除 | A./B |
[6 3] ./ [4 8] = [1.5 0.375] |
.\ |
矩阵与矩阵对应位置左除 | A.\B |
[6 3] .\ [4 8] = [0.6667 2.6667] |
^ |
矩阵与向量乘方 | A^b |
[1 2; 3 4]^3 = [37 54; 81 118] |
.^ |
矩阵与矩阵对应位置乘方 | A.^B |
[1 2; 3 4].^[1 2; 3 4] = [1 4; 27 256] |
' |
矩阵的转置 | A' |
[1 2; 3 4]' = [1 3; 2 4] |
特殊矩阵
linspace(a,b,n)
:a
为起始值,b
为终止值,n
为元素个数(缺省值为100
)eye(n)
:得到一个n×n
的单位矩阵zeros(a,b)
:得到一个a×b
的全0
矩阵ones(a,b)
:得到一个a×b
的全1
矩阵diag(vector)
:得到一个以向量vector
中元素为对角线的对角矩阵rand(a,b)
:得到一个a×b
的(0,1)
之间均匀分布的随机数矩阵
一些矩阵函数
max()
:每列最大值sum()
:每列元素之和mean()
:每列元素均值sort()
:每列元素由小至大排序sortrows()
:按照第一列元素由小到大排列行顺序size()
:[行, 列]length()
:列数find()
:满足条件的一维索引reshape()
:改变矩阵的尺寸
Exercise
1 | cos(sqrt((1+2+3+4)^3/5)) |
1 | sin(sqrt(pi))+log(tan(1)) |
1 | 2^(3.5*1.7) |
1 | exp(sin(10)) |
1 | >> format rat |
1 | >> format long |
1 | >> A = [1 21 6; 5 17 9; 31 2 7]; |
结构化程序与自定义函数
程序文件<filename>.m
- 句首使用
%
作为注释 - 段首使用
%%
作为段落划分
流程控制
(与C++
差别不大)
if
、elseif
、else
for
switch
、case
、otherwise
try
、catch
while
break
continue
end
:所有流程控制语句均以此为结束标志pause
return
逻辑运算符
~=
:不等于- 其余与
C++
无异
预先分配内存
(预先分配内存可以节省程序运行时间。)
1 | tic |
一些小技巧
程序运行前使用
clear all
移除所有变量,使用close all
关闭所有图表,使用clc
清空命令窗口使用
...
进行换行1
2A = [1 2 3 4 5 6; ...
6 5 4 3 2 1];使用
Ctrl + C
强制终止正在运行的程序
函数文件<functionname>.m
(文件名应当与函数名一致)
内置的函数参数
inputname
:输入变量名列表mfilename
:函数源代码文件名nargin
:输入变量个数nargout
:输出变量个数varargin
:可变长输入参数列表varargout
:可变长输出参数列表
函数句柄
使用函数句柄 = @(输入变量) 输出变量
定义函数,之后可以通过函数句柄调用函数
Exercise
1 | n = 1; |
变量与文件读写
字符类型
- 使用单引号对
''
构造字符串 - 字符串在内存中是以矩阵形式存储的
ASCII
码
结构体
元胞数组
使用{}
定义元胞数组,它可以容纳各种数据类型的元素
文件存储与读取
.mat
文件
save <filename>.mat <变量>
:不写<变量>
表示所有变量save <filename>.mat <变量> -ascii
:此种方式生成文件可读load('<filename>.mat')
load('<filename>.mat','-ascii')
Excel
文件
<变量名> = xlsread('<filename>.xlsx', <位置>)
(其中<位置>
可以省略,自动读取数字)xlswrite('<filename>.xlsx', <variable>, <sheet>, <位置>)
<变量名1 变量名2> = xlsread('<filename>.xlsx', <位置>)
:<变量名2>
为元胞数组,存储了标题
Exercise
1 | s1 = 'I like the letter E'; |
绘图
plot()
plot(x,y,'str')
(x
的缺省值为[1:length(y)]
,str
见下表)
多张图表
hold on/off
:多根图线显示于同一图片上- 使用
figure
画多个图表(分开)figure, plot(x, y1)
figure, plot(x, y2)
subplot(m, n, 1);
:m×n
个图表(序号按行)
标注信息
Legend('L1', ...)
:标注线条样式样例及名称'L1', ...
title()
:添加图表标题<x/y>label()
:添加<x/y>
轴标签text(<x坐标>, <y坐标>, '$$ Latex公式 $$', 'Interpreter', 'latex')
:使用LaTex
构造公式(专门去学一下吧)annotation('arrow', 'X', [横纵坐标], 'Y', [横纵坐标])
:构造箭头
图表美化
改变坐标轴属性
- 改变字体大小
set(gca, 'FontSize', 25);
- 改变刻度
set(gca, 'XTick', 0:pi/2:2*pi);
- 改变刻度标记
set(gca, 'XTickLabel', 0:90:360);
set(gca, 'FontName', 'symbol');
set(gca, 'XTickLabel', {'0', 'p/2', 'p', '3p/2', '2p'});
改变线条属性
1 | h = plot(x,y); |
Exercise
1 | t = [1:0.01:2]; |